#ifndef __TASK_RUN_H
#define __TASK_RUN_H
#include <stdint.h>

/** @defgroup BASIC_DEF Basic Definition
 * @{
 */
#define HAL_UINT32_MAX 0xffffffff   /**< Maxium number of UINT32 */
#define HAL_TICK_MAX HAL_UINT32_MAX /**< Maxium number of tick */
/**
 * @}
 */

#define TASK_PERIOD_TASK1 	0		/* 系统初始化任务周期 */
#define TASK_PERIOD_TASK2 	100		/* 顶层应用任务周期 */
#define TASK_PERIOD_TASK3 	5
#define TASK_PERIOD_TASK4 	0		/* 通讯相关任务周期 */
#define TASK_PERIOD_TASK5 	100
#define TASK_PERIOD_TASK6 	100
#define TASK_PERIOD_TASK7 	200
#define TASK_PERIOD_TASK8 	100
#define TASK_PERIOD_TASK9 	20
#define TASK_PERIOD_TASK10 	100

#define TASK2_EVENT1_COMM_WRITE 	0x0001	/* 通讯写入数据的请求 */
#define TASK2_EVENT2_COMM_ABNORMAL 	0x0002	/* 通讯异常 */
#define TASK2_EVENT3_COMM_FRUSH	 	0x0004	/* 通讯数据刷新 */
#define TASK2_EVENT4_DATA_READ	 	0x0008	/* 数据读取请求 */
#define TASK2_EVENT5_DATA_SAVE	 	0x0010	/* 数据保存请求 */
#define TASK2_EVENT6_DATA_EXPORT	 0x0020	/* 数据导出请求 */
#define TASK2_EVENT7_RTC_EDIT	 	0x0040	/* RTC修改请求 */
#define TASK2_EVENT8_HMI_TOUCH	 	0x0080	/* HMI按下 */
#define TASK2_EVENT9_HMI_BACKLIGHT	0x0100	/* HMI背光调节请求 */

#define TASK3_EVENT1_COMM_ABNORMAL 	0x0001	/* 通讯异常 */
#define TASK3_EVENT2_COMM_FRUSH	 	0x0002	/* 通讯数据刷新 */
#define TASK4_EVENT1_COMM_WRITE 	0x0001	/* 通讯写入数据的请求 */

#define TASK5_EVENT1_NAND_MATERIAL_READ	 0x0001	/* 从NAND读取字体、图库到SDRAM */
#define TASK5_EVENT1_NAND_SCREEN_READ	 0x0002	/* 从NAND读取屏幕到SDRAM */
#define TASK5_EVENT1_NAND_PACK_READ	     0x0004	/* 从NAND读取一包运行数据 */
#define TASK5_EVENT1_NAND_CURVE_READ	 0x0008	/* 从NAND读取运行曲线数据 */
#define TASK5_EVENT1_NAND_ALARM_READ	 0x0010	/* 从NAND读取报警数据 */

#define TASK5_EVENT2_NAND_MATERIAL_WRITE	 0x0020	/* 向NAND写入素材 */
#define TASK5_EVENT2_NAND_SCREEN_WRITE	     0x0040	/* 向NAND写入屏幕参数 */
#define TASK5_EVENT2_NAND_RUN_WRITE	 	     0x0080	/* 向NAND写入运行数据 */
#define TASK5_EVENT2_NAND_ALARM_WRITE        0x0100	/* 向NAND写入报警信息 */

#define TASK6_EVENT1_USB_MATERIAL_READ	 	0x0001	/* 读取USB中的素材 */
#define TASK6_EVENT2_USB_DATA_WRITE	 	    0x0002	/* 向USB中写入数据 */

#define TASK7_EVENT1_RTC_EDIT	 	0x0001	/* RTC修改请求 */
#define TASK7_EVENT2_RTC_READ	 	0x0002	/* RTC读取请求 */
#define TASK8_EVENT1_COMM_ABNORMAL 	0x0001	/* 通讯异常 */
#define TASK8_EVENT2_COMM_FRUSH	 	0x0002	/* 通讯数据刷新 */
#define TASK9_EVENT1_HMI_TOUCH	 	0x0001	/* HMI按下 */
#define TASK10_EVENT1_HMI_BACKLIGHT	0x0001	/* HMI背光调节请求 */

enum task_index {
  TASK1_INIT = 0,			/* 系统初始化任务 */
  TASK2_APP,				/* 顶层应用任务 */
  TASK5_DATA_RW,			/* 数据读写相关任务 */
  TASK6_DATA_EXPORT,		/* 数据导出相关任务 */
  TASK4_COMMUNICATION,		/* 通讯相关任务 */
  TASK3_HMI,				/* 触摸屏相关任务 */
  TASK7_RTC,				/* 实时时钟相关任务 */
  TASK8_RGB,				/* RGB灯光相关任务 */
  TASK9_BEEP,				/* 蜂鸣器相关任务 */
  TASK10_BACKLIGHT,			/* 背光相关任务 */
  TASK_INDEX_MAX
};

struct task_pcb {
  uint8_t enable;
  uint32_t tick_timeout;
  uint32_t period;
  uint32_t event;
  uint32_t suspend_tim;
  int (*task_entry)(struct task_pcb *task);
};

void task_init(enum task_index index, int (*task_entry)(struct task_pcb *task),
               uint32_t period);
void task_start(enum task_index index);
void task_suspend(enum task_index index, uint32_t tim);
void task_tick_inc(uint16_t inc);
void task_stop(enum task_index index);
int task_event_send(enum task_index index, uint32_t set);
void task_process(void);

#endif
